package server.server02;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.util.*;

/**
 * 封装请求协议：封装请求参数为Map
 */
public class Request {
    //协议信息
    private String requestInfo;
    //请求方式
    private String method;
    //请求的url
    private String url;
    //请求的参数
    private String queryStr = "";
    //换行符
    private final String CRLF = "\r\n";
    //存储参数
    private Map<String,List<String>> parameterMap;
    public Request(Socket client) throws IOException {
        this(client.getInputStream());
    }
    public Request(InputStream is) {
        parameterMap =new HashMap<String, List<String>>();
        byte[] datas = new byte[1024*1024*1024];
        int len = 0;
        try {
            len = is.read(datas);
            this.requestInfo = new String(datas,0,len);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        //分解字符串
        parseRequest();
    }
    private void parseRequest(){
        System.out.println("---分解开始---");
       //获取请求方式：开头到第一个/
        this.method=this.requestInfo.substring(0,this.requestInfo.indexOf('/')).toLowerCase().trim();
        //获取请求url ：开头到第一个/到http/  可能包含请求参数?前面的为url
        int startIdx = this.requestInfo.indexOf("/")+1;
        int endIdx = this.requestInfo.indexOf("HTTP/");
        this.url = this.requestInfo.substring(startIdx,endIdx).trim();
        //获取？的的位置
        int queryIdx = this.url.indexOf('?');
        if(queryIdx>=0){//存在请求参数
            String[] urlArry = this.url.split("\\?");
            this.url = urlArry[0];
            queryStr = urlArry[1].trim();
        }
        //获取请求参数：如果get已经获取，如果是post可能在请求体中
        if(method.equals("post")){
            String qStr = this.requestInfo.substring(this.requestInfo.lastIndexOf(this.CRLF)).trim();
            if (qStr.length()>0){
                if (queryStr==""||queryStr==null){
                    queryStr+=qStr;
                }else{
                    queryStr+="&"+qStr;
                }
            }
        }
        System.out.println(this.queryStr);
        //转成map
        convertMap();
    }
    //请求参数为map
    private void convertMap(){
        //分割字符串 &
        String[] keyValues = this.queryStr.split("&");
        for (String query:keyValues){
            //分割字符串 =
            String[] kv = query.split("=");
            kv= Arrays.copyOf(kv,2);
            //获取key和calus
            String key = kv[0];
            String val = kv[1]==null?null:decode(kv[1],"UTF-8");
            //存储到map中
            if(!parameterMap.containsKey(key)){//不包含这个key
                parameterMap.put(key,new ArrayList<String>());//第一次
            }
            parameterMap.get(key).add(val);
        }
    }

    /**
     * 处理中文
     * @return
     */
    private String decode(String val,String enc){
        try {
            return java.net.URLDecoder.decode(val,enc);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过name获取对应的多个值
     * @param key
     * @return
     */
    public String[] getParameterMap(String key){
        List<String> list = this.parameterMap.get(key);
        if(null==list || list.size()<1){
            return null;
        }
        return list.toArray(new String[0]);//将List转为数组
    }

    /**
     * 通过key获取一个值
     */
    public String getParameter(String key){
        String[] val = getParameterMap(key);
        return val==null?null:val[0];
    }

    public String getMethod() {
        return method;
    }

    public String getUrl() {
        return url;
    }

    public String getQueryStr() {
        return queryStr;
    }
}
